import { defineStore } from 'pinia'
import { ref, computed, watch } from 'vue'
import { getCartList, addToCart, deleteCart, updateCart, clearCart, createFromCart } from '@/api/modules/cart'
import type { CartItem } from '@/types/cart'
import { useUserStore } from './user'
import { ElMessage } from 'element-plus'

export const useCartStore = defineStore('cart', () => {
  const cartItems = ref<CartItem[]>([])
  const isLoading = ref(false)
  const error = ref<string | null>(null)
  const userStore = useUserStore()

  // 获取购物车总数
  const cartCount = computed(() => {
    return cartItems.value.length
  })

  // 获取购物车总价
  const cartTotal = computed(() => {
    return cartItems.value.reduce((sum, item) => sum + (item.goodsInfo.price * item.count), 0)
  })

  // 获取购物车列表
  async function fetchCartList() {
    // 检查是否有 token
    if (!userStore.token) {
      cartItems.value = []
      return
    }

    try {
      isLoading.value = true
      error.value = null
      const response = await getCartList()
      if (response.code === 1000) {
        cartItems.value = response.data
      } else {
        error.value = response.message || '获取购物车失败'
      }
    } catch (err) {
      error.value = '获取购物车失败'
      console.error('获取购物车失败:', err)
    } finally {
      isLoading.value = false
    }
  }

  // 添加商品到购物车
  async function addItemToCart(goodsId: string, count: number = 1) {
    // 检查是否有 token
    if (!userStore.token) {
      ElMessage.warning('请先登录')
      return false
    }

    try {
      // 注意：这里的 count 参数应该已经在调用方验证过包装类型和拆零限制
      // 验证逻辑包括：
      // 1. 如果 midpack > 1 且 isMidpackSaleDisabled === 1，count 必须是 midpack 的倍数
      // 2. 如果 midpack <= 1，则为件包装，可以按任意数量下单
      // 3. 如果 midpack > 1 且 isMidpackSaleDisabled === 0，支持拆零，可以按任意数量下单
      const response = await addToCart({ goodsId, count })
      if (response.code === 1000) {
        await fetchCartList() // 重新获取购物车列表
        return true
      }
      return false
    } catch (err) {
      ElMessage.error(err as string)
      console.error('添加购物车失败:', err)
      return false
    }
  }

  // 更新购物车商品数量
  async function updateItemQuantity(id: number, count: number) {
    // 检查是否有 token
    if (!userStore.token) {
      ElMessage.warning('请先登录')
      return false
    }

    try {
      const response = await updateCart({ id, count })
      if (response.code === 1000) {
        // 更新本地数据
        const index = cartItems.value.findIndex(item => item.id === id)
        if (index !== -1) {
          cartItems.value[index] = {
            ...cartItems.value[index],
            count
          }
        }
        return true
      }
      return false
    } catch (err) {
      console.error('更新购物车失败:', err)
      return false
    }
  }

  // 删除购物车商品
  async function removeItem(cartId: number) {
    // 检查是否有 token
    if (!userStore.token) {
      ElMessage.warning('请先登录')
      return false
    }

    try {
      const response = await deleteCart({ id: cartId })
      if (response.code === 1000) {
        await fetchCartList() // 重新获取购物车列表
        return true
      }
      return false
    } catch (err) {
      console.error('删除购物车商品失败:', err)
      return false
    }
  }

  // 清空购物车
  async function clearCartItems() {
    // 检查是否有 token
    if (!userStore.token) {
      ElMessage.warning('请先登录')
      return false
    }

    try {
      const response = await clearCart()
      if (response.code === 1000) {
        cartItems.value = []
        return true
      }
      return false
    } catch (err) {
      console.error('清空购物车失败:', err)
      return false
    }
  }

  // 更新购物车项
  function updateCartItems(items: CartItem[]) {
    cartItems.value = items
  }

  // 从购物车创建订单
  async function createOrderFromCart(cartIds: number[], mjBillNo?: string) {
    // 检查是否有 token
    if (!userStore.token) {
      ElMessage.warning('请先登录')
      return false
    }

    try {
      const response = await createFromCart({ cartIds, mjBillNo })
      if (response.code === 1000) {
        // 重新获取购物车列表
        await fetchCartList()
        return true
      }
      return false
    } catch (err: any) {
      console.error('创建订单失败:', err)
      return err
    }
  }

  // 监听 token 变化，重新获取购物车列表
  watch(() => userStore.token, (newToken) => {
    if (newToken) {
      fetchCartList()
    } else {
      cartItems.value = []
    }
  })

  return {
    cartItems,
    isLoading,
    error,
    cartCount,
    cartTotal,
    fetchCartList,
    addItemToCart,
    updateItemQuantity,
    removeItem,
    clearCartItems,
    updateCartItems,
    createOrderFromCart
  }
}) 